/// 1. HashMap<k, v>
/// 2. 创建HashMap
/// 3. 读取
/// 4. 遍历
/// 5. 更新
use std::collections::HashMap; //导入HashMap的库
fn main() {
    // 创建空的HashMap
    let mut map = HashMap::new();
    map.insert(String::from("Blue"), 10);
    map.insert(String::from("Red"), 20);
    // println!("{:#?}",map);

    // 也可以通过vector实现key和value
    let keys = vec![String::from("Blue"), String::from("Red")];
    let values = vec![10, 20];
    // let scores: Vec<_> = keys.iter().zip(values.iter()).collect();
    let scores:HashMap<_, _> = keys.iter().zip(values.iter()).collect();

    // 读取里面的值 用的是get方法读取元素，返回的是Option，所以需要处理Option（可用if let或者match）
    let k = String::from("Blue");
    // 使用if let读取
    if let Some(v) = scores.get(&k){
        println!("v = {:?}",v);
    };
    let v = scores.get(&String::from("Yellow"));
    // 使用match读取
    match v {
        None => {println!("None")},
        Some(value) => {println!("v match = {:?}",value);}
    }

    // 遍历HashMap: 遍历的时候不会依顺序遍历，而是随机的
    for (key,value) in &scores {
        println!("key = {:?}, value = {:?}",key, value);
    }

    // 更新HashMap
    // 直接插入，
    let mut ss = HashMap::new();
    ss.insert(String::from("One"), 1);
    ss.insert(String::from("Two"), 2);
    ss.insert(String::from("Three"), 3);
    // 关键字存在时更新
    ss.insert(String::from("One"), 4);
    println!("{:?}", ss);

    // 关键字不存在的时候才插入场景
    let mut ss1 = HashMap::new();
    ss1.insert(String::from("One"), 1);
    ss1.insert(String::from("Two"), 2);
    ss1.insert(String::from("Three"), 3);
    // 关键字存在不插入，不存在时才插入
    ss1.entry(String::from("One")).or_insert(4);
    println!("{:?}", ss1);

    // 更具旧的数据来更新一个值
    // text.split_whitespace() 会根据空白字符将字符串 "hello world wonderful world" 分割成单词。
    let text = "hello world wonderful world";
    let mut map = HashMap::new();
    for word in text.split_whitespace() {
        // map.entry(word).or_insert(0) 检查当前单词是否已经在 HashMap 中。如果没有，就插入这个单词，并将计数初始化为 0。
        // 此时or_insert(0)初始值为0，因为map是可变的，所以程序执行完毕又执行 *count += 1;，此时值变成1
        let count = map.entry(word).or_insert(0);
        *count += 1;
    }
    println!("{:?}", map);

    // 删除元素
    let mut ss3 = HashMap::new();
    ss3.insert(String::from("One"), 1);
    ss3.insert(String::from("Two"), 2);
    ss3.insert(String::from("Three"), 3);
    // 这个是删除元素的关键字remove，通过Key删除元素
    ss3.remove("One");
    println!("ss3 = {:?}", ss3);
    // 检查关键字是否存在
    if ss3.contains_key("Two") {
        // ss3.get("Two").unwrap(): 通过Key访问值
        println!("Tow = {}",ss3.get("Two").unwrap());
    } else { println!("元素不存在"); }


    println!("Hello, world!");
}
